package com.marmot.cloud.framework.core.ddd;


import cn.hutool.core.bean.BeanUtil;

import java.util.List;

/**
 * Api模型转换接口
 */
public interface ApiDomainAssembler<M> {


    /**
     * 对象向下转换为领域模型
     *
     * @param object      要转换的对象
     * @param targetClazz 目标类型
     * @return 目标领域对象
     */
    default M trans2Domain(Object object, Class<M> targetClazz) {
        return BeanUtil.copyProperties(object, targetClazz);
    }

    /**
     * 对象集合向下转换为领域模型集合
     *
     * @param objects     要转换的对象集合
     * @param targetClazz 目标类型
     * @return 目标领域对象集合
     */
    default List<M> trans2Domain(List<?> objects, Class<M> targetClazz) {
        return BeanUtil.copyToList(objects, targetClazz);
    }


    /**
     * 应用模型 => 领域模型
     *
     * @param model 应用模型
     * @return 目标持久化对象
     */
    default <D, M> D trans2domain(M model, Class<D> targetClazz) {
        D entity = BeanUtil.copyProperties(model, targetClazz);
        return entity;
    }

    /**
     * 应用模型 => 领域模型
     *
     * @param models 应用模型对象集合
     * @return 目标持久化对象
     */
    default <D, M> List<D> trans2domains(List<M> models, Class<D> targetClazz) {
        List<D> entitys = BeanUtil.copyToList(models, targetClazz);
        return entitys;
    }

    /**
     * 领域模型  =>  应用模型
     *
     * @param domain 持久化对象
     * @return 目标领域对象
     */
    default <D, M> M trans2model(D domain, Class<M> targetClazz) {
        M model = BeanUtil.copyProperties(domain, targetClazz);
        return model;
    }

    /**
     * 领域模型  =>  应用模型
     *
     * @param domains 持久化对象集合
     * @return 目标领域对象
     */
    default <D, M> List<M> trans2models(List<D> domains, Class<M> targetClazz) {
        List<M> models = BeanUtil.copyToList(domains, targetClazz);
        return models;
    }


}
